
import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = a + b   # 输出: [5 7 9] (元素相加)
d = a * 2   # 输出: [2 4 6] (标量乘法)
e = b ** 2  # 输出: [16 25 36] (元素取平方)
f = a * b   # 输出: [4 10 18] (元素点乘, 不是矩阵乘法!)



"""
==============   矩阵乘法 (@或 np.dot)  =====================
"""
g = np.array([[1, 2], [3, 4]])
h = np.array([[5, 6], [7, 8]])
i = g @ h   # 或 np.dot(g, h)    # 标准矩阵乘法
# 输出:
# [[19 22]
#  [43 50]]
print(i)


"""
聚合函数： 对数组整个或沿指定轴进行统计计算。
"""
l = np.array([[1, 2], [3, 4]])
print(l.sum())       # 输出: 10 (所有元素和)
print(l.sum(axis=0)) # 输出: [4 6] (计算每列的和，即沿第0轴求和，行方向“坍缩”)
print(l.sum(axis=1)) # 输出: [3 7] (计算每行的和，即沿第1轴求和，列方向“坍缩”)
print(l.min())       # 输出: 1 (最小值)
print(l.max())       # 输出: 4 (最大值)
print(l.mean())      # 输出: 2.5 (平均值)
print(l.std())       # 输出: 1.118...(标准差)
print(np.median(l))  # 输出: 2.5 (中位数)

"""
改变形状和转置：
"""
m = np.arange(6)      # [0 1 2 3 4 5]
n = m.reshape(2, 3)   # 改变形状为2行3列
# 输出:
# [[0 1 2]
#  [3 4 5]]
o = n.T               # 转置: 行变列，列变行
# 输出:
# [[0 3]
#  [1 4]
#  [2 5]]
# `reshape` 返回视图，除非指定 `copy=True`


"""
拼接和分割：
"""
# 水平拼接 (要求行数相同)
p = np.array([[1, 2], [3, 4]])
q = np.array([[5, 6]])
r = np.concatenate((p, q.T), axis=1)  # q.T是列向量，按列(axis=1)拼接
# 或 np.hstack((p, q.T))         等效
# 输出:
# [[1 2 5]
#  [3 4 6]]

# 垂直拼接 (要求列数相同)
s = np.array([[7, 8]])
t = np.concatenate((p, s), axis=0)  # 按行(axis=0)拼接
# 或 np.vstack((p, s))           等效
# 输出:
# [[1 2]
#  [3 4]
#  [7 8]]

# 分割
u = np.arange(10)
v1, v2, v3 = np.split(u, [3, 5])  # 在第3和第5个索引位置切割
print(v1) # [0 1 2] (索引0-2)
print(v2) # [3 4]   (索引3-4)
print(v3) # [5 6 7 8 9] (索引5-9)


""" 
文件 I/O
"""
data = np.random.randn(100, 3)
np.save('my_data.npy', data)  # 默认保存为.npy后缀

loaded_data = np.load('my_data.npy')

# 存储多个数组 (*.npz)：
arr1 = np.arange(5)
arr2 = np.eye(2)
np.savez('archive.npz', a=arr1, b=arr2)  # 以关键字参数方式提供要保存的数组


archive = np.load('archive.npz')
print(archive['a'])  # 通过保存时的名字取出数组
print(archive['b'])

"""
​​读写文本文件 (csv, txt):
"""
# 保存到文本文件 (如csv)
data_to_save = np.array([[1, 2.2, 'text'], [3, 4.4, 'more']]) # 注意混合类型可能需特殊处理
np.savetxt('data.csv', data_to_save, delimiter=',', fmt='%s')  # fmt指定格式

# 从文本文件加载
loaded_csv = np.loadtxt('data.csv', delimiter=',', dtype=np.str_)  # 可能需要指定dtype